
/**
 * \file:  affichage_menu_catalogue.c
 * \author: Alexandre, Donesse, Brahim.
 * Implementation de l'affichage simplifie et detaille d'un catalogue.
 */
#include <stdio.h>
#include <stdlib.h>
#include "affichage_menu_catalogue.h"
#include "produit.h"
#include "commande.h"
#include "categorie.h"
#include "typesprimitifs.h"
#include "menu_principal.h"

/**
 * Fonction privee a ce fichier, effectuant une recherche de produit via
 * chercher_produit, lorsque l'utilisateur indique l'identifiant du produit.
 */
static POINTEUR_PRODUIT trouver_produit(POINTEUR_LISTE_PRODUIT lp);

/**
 * Procedure privee a ce fichier, non accessible de l'exterieur.
 * Effectue l'appel a un affichage simplifie de produit des lors que
 * l'identifiant du produit a ete donne.
 */
static void affichage_liste_simplifie(POINTEUR_LISTE_PRODUIT lp);

/**
 * Procedure privee a ce fichier, non accessible de l'exterieur.
 * Effectue l'appel a un affichage detaille de produit des lors que
 * l'identifiant du produit a ete donne.
 */
static void affichage_liste_detail(POINTEUR_LISTE_PRODUIT lp);

/** auteur : Matthieu
 * Procedure privee a ce fichier, non accessible de l'exterieur.
 * Menu pour l'ajout d'un produit du catalogue a notre commande en cours.
 * Ajout de la dependance a commande.h en consequence
 */
static void menu_ajouter_produit_commande(POINTEUR_COMMANDE pc, POINTEUR_LISTE_PRODUIT lp);

POINTEUR_PRODUIT trouver_produit(POINTEUR_LISTE_PRODUIT lp) {
    CHAINE saisie;
    POINTEUR_PRODUIT pp;
    int id, retour;
    do {
        printf("Indiquez l'identifiant du produit (0 pour annuler) : ");
        fflush(stdout);
        fgets(saisie, MAX_CHAR, stdin);
        retour = sscanf(saisie, "%d", &id);
    if (id != 0) pp = chercher_produit(lp, id);
    else return NULL;
} while (!pp);
    return pp;
}

/**
 * Procedure privee a ce fichier, non accessible de l'exterieur.
 * Effectue l'appel a un affichage simplifie de produit des lors que
 * l'identifiant du produit a ete donne.
 */
void affichage_liste_simplifie(POINTEUR_LISTE_PRODUIT lp) {
    POINTEUR_PRODUIT pp = trouver_produit(lp);
    if (pp != NULL) {
        affichage_produit_simplifie(pp);
    } else {
        printf("Le produit  que vous recherchez  n'existe pas.\n");
    }
}

/**
 * Procedure privee a ce fichier, non accessible de l'exterieur.
 * Effectue l'appel a un affichage detaille de produit des lors que
 * l'identifiant du produit a ete donne.
 */
void affichage_liste_detail(POINTEUR_LISTE_PRODUIT lp) {
    POINTEUR_PRODUIT pp = trouver_produit(lp);
    if (pp != NULL) {
        affichage_produit_detail(pp);
    } else {
        printf("Le produit que vous recherchez n'existe pas.\n");
    }
}

void affichage_produit_simplifie(POINTEUR_PRODUIT pp) {
    printf("%20s %8.2f euros", pp->nom, pp->prix_u);
}

void affichage_menu_catalogue(POINTEUR_LISTE_PRODUIT lp) {
    int i = 1;
    printf("\n");
    for (; lp; lp = lp->suivant) {
        printf("%d: ", lp->pproduit->ID);
        affichage_produit_simplifie(lp->pproduit);
        i++;
        printf("\n");
    }

}

void affichage_produit_detail(POINTEUR_PRODUIT pp) {
    printf("\nProduit: %s \n Prix : %.2f \n Categorie: %s \n \
            Quantite disponible %d \n", pp->nom, pp->prix_u,
            donner_nom_categorie(pp->categorie), pp->quantite_disponible);
    printf("\n");

}

/** auteur : Matthieu
 * Procedure privee a ce fichier, non accessible de l'exterieur.
 * Menu pour l'ajout d'un produit du catalogue a notre commande en cours.
 * Ajout de la dependance a commande.h en consequence
 */
void menu_ajouter_produit_commande(POINTEUR_COMMANDE pc, POINTEUR_LISTE_PRODUIT lp) {
    POINTEUR_PRODUIT pp;
    CHAINE saisie;
    ENTIER quantite = -1;

    pp = trouver_produit(lp);
    if(pp)
    {
    printf("\n\n");
    affichage_produit_detail(pp);
    do {
        printf("0 : retour catalogue.\n Quelle quantite de ce produit souhaitez vous ?\n quantite : ");
         fgets(saisie, MAX_CHAR, stdin);
        sscanf(saisie, "%d", &quantite);

        if (!quantite)
            break;
        else
            if ((quantite > 0)&&(quantite<=pp->quantite_disponible))
            { 
               ajouter_produit_commande(pp, quantite, pc);
               printf("Ce produit a ete correctement ajoute a votre panier.\n\n");
            }
            else printf("Quantite invalide ! Quantite maximum disponible : %d\n",pp->quantite_disponible), quantite = -1;
    } while (quantite == -1);
    }
}

/* Pour que la procedure suivante fonctionne, elle a soit besoin d'un
 * pointeur sur liste de produits, soit elle le demande à un module susceptible
 * de le lui fournir... A vous de faire un choix !
 * 
 * Question aux auteurs : est-il besoin d'appeler menu_principal ? Si c'est
 * menu_principal qui vous appelle, ne vaut-il pas mieux rendre tout simplement
 * la main (fin normal de votre procedure => fin d'appel) au lieu de
 * la rappeler ? Sinon, ça peut faire une chaine d'appels infinie entre les deux...
 */
void menu_catalogue(POINTEUR_LISTE_PRODUIT lp, POINTEUR_COMMANDE pc) {
    int choix, retour;
    CHAINE saisie;
    BOOLEEN test; /*bouleen initialement place a faux*/
    BOOLEEN catalogue_affiche;

    printf("*******************MENU**CATALOGUE**********************\n");

    do {
        printf("\nBonjour que voulez-vous faire ? : \n");
        printf("\n taper 1 pour ajouter un produit a la commande  \n");
        printf("\n taper 2 pour voir le catalogue  \n");
        printf("\n taper 3 pour voir le produit en detail \n");
        printf("\n taper 4 pour retourner au menu principal\n");
        fgets(saisie, MAX_CHAR, stdin);
        retour = sscanf(saisie, "%d", &choix);
        switch (choix) {
            case 1:
                menu_ajouter_produit_commande(pc, lp);
                test = faux;
                break;
            case 2: affichage_menu_catalogue(lp);
                test = faux;
                catalogue_affiche = vrai;
                break;
            case 3: if (!catalogue_affiche) {
                    printf("Nous allons d'abord vous montrer le catalogue...");
                    affichage_menu_catalogue(lp);
                    catalogue_affiche = vrai;
                }
                affichage_liste_detail(lp);
                test = faux;
                break;
            case 4:test = vrai;
                break;

            default: printf("\n erreur!! saisissez un nombre correct \n \n");
                test = faux;
                break;
        }

    } while (test == faux); /* on recommence la saisie tant que test = 0 cad
      *  tant le nombre rentre est different des cas possibles*/

}











